import com.fasterxml.jackson.databind.ObjectMapper;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;

//代码实例:获取POST请求中的参数(2)
// testPost2.html
//采取JSON的格式来传递POST请求的body

//通过这个类来表示解析后的结果.Json解析,其实就是把Json格式的字符串转成一个Java的对象.
//所以这里需要把表示对象的类给准备好
class JsonData{
    public int userId;
    public int classId;
}
@WebServlet("/getPostParameter2")
public class GetPostParameter2 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("application/json;charset=utf-8");//指定编码格式
        String body = readBody(req);//读取请求中的body
//        这里只是读出来了,但没解析捏.服务器这边处理好了,还需要构造一个http请求
//        resp.getWriter().write(body);

        //--
//        使用Jackson解析json的时候,需要先明确,要把这个字符串转成啥样的对象
//        这里是转成这种形式{"userId":100,"classId":10}
        ObjectMapper objectMapper = new ObjectMapper();
        JsonData jsonData = objectMapper.readValue(body,JsonData.class);
        //第一个参数是把哪个数据进行转换,第二个参数就是要转换成啥样的对象,得到的就是Java对象的实例

        resp.getWriter().write(String.format("userId: %d,classId: %d",jsonData.userId,jsonData.classId));

    }

    private String readBody(HttpServletRequest req) throws IOException {
        //读取body需要根据req getInputStream得到一个流对象,从这个流对象中读取
        InputStream inputStream = req.getInputStream();
        //通过contentLength拿到请求中body的字节数
        int contentLength = req.getContentLength();//以字节为单位返回请求主体(body)的长度，并提供输入流，
        //或者如果长度未知则返回 -1
        byte[] buffer = new byte[contentLength];
        inputStream.read(buffer);// 将请求的内容读取到buffer这个缓冲区里去
        return new String(buffer,"utf-8");
    }
}
